#pragma once
#include <iostream>
#include <pthread.h>

namespace MutexModule
{
    // 互斥锁类，封装 pthread_mutex_t
    class Mutex
    {
    public:
        // 构造函数：初始化互斥锁
        Mutex()
        {
            pthread_mutex_init(&_mutex, nullptr); // 第二个参数为属性，nullptr表示默认
        }
        // 加锁
        void Lock()
        {
            int n = pthread_mutex_lock(&_mutex); // 阻塞直到获取锁
            (void)n;                             // 显式忽略返回值）
        }
        // 解锁
        void Unlock()
        {
            int n = pthread_mutex_unlock(&_mutex);
            (void)n; // 同上
        }
        // 析构函数：销毁互斥锁
        ~Mutex()
        {
            pthread_mutex_destroy(&_mutex);
        }
        // 获取底层 pthread_mutex_t 指针（用于需要原生锁的场景）
        pthread_mutex_t *Get()
        {
            return &_mutex;
        }

    private:
        pthread_mutex_t _mutex; // 底层POSIX互斥锁
    };
    // RAII锁守卫，构造时加锁，析构时自动解锁
    class LockGuard
    {
    public:
        // 构造函数：引用一个Mutex并立即加锁
        LockGuard(Mutex &mutex) : _mutex(mutex)
        {
            _mutex.Lock();
        }

        // 析构函数：自动解锁
        ~LockGuard()
        {
            _mutex.Unlock();
        }

    private:
        Mutex &_mutex; // 引用外部Mutex，避免拷贝
    };
}